
package com.cptravel.view.slidingmenu;

import android.graphics.Canvas;
import android.view.animation.Interpolator;

import com.cptravel.view.slidingmenu.SlidingMenu.CanvasTransformer;

public class CanvasTransformerBuilder
{
    private CanvasTransformer mTrans;
    private static Interpolator lin = new Interpolator()
    {
        @Override
        public float getInterpolation(float t)
        {
            return t;
        }
    };

    private void initTransformer()
    {
        if (mTrans == null)
            mTrans = new CanvasTransformer()
            {
                @Override
                public void transformCanvas(Canvas canvas , float percentOpen)
                {
                }
            };
    }

    public CanvasTransformer zoom(final int openedX , final int closedX , final int openedY , final int closedY , final int px , final int py)
    {
        return zoom(openedX, closedX, openedY, closedY, px, py, lin);
    }

    public CanvasTransformer zoom(final int openedX , final int closedX , final int openedY , final int closedY , final int px , final int py , final Interpolator interp)
    {
        initTransformer();
        mTrans = new CanvasTransformer()
        {
            @Override
            public void transformCanvas(Canvas canvas , float percentOpen)
            {
                mTrans.transformCanvas(canvas, percentOpen);
                float f = interp.getInterpolation(percentOpen);
                canvas.scale((openedX - closedX) * f + closedX, (openedY - closedY) * f + closedY, px, py);
            }
        };
        return mTrans;
    }

    public CanvasTransformer rotate(final int openedDeg , final int closedDeg , final int px , final int py)
    {
        return rotate(openedDeg, closedDeg, px, py, lin);
    }

    public CanvasTransformer rotate(final int openedDeg , final int closedDeg , final int px , final int py , final Interpolator interp)
    {
        initTransformer();
        mTrans = new CanvasTransformer()
        {
            @Override
            public void transformCanvas(Canvas canvas , float percentOpen)
            {
                mTrans.transformCanvas(canvas, percentOpen);
                float f = interp.getInterpolation(percentOpen);
                canvas.rotate((openedDeg - closedDeg) * f + closedDeg, px, py);
            }
        };
        return mTrans;
    }

    public CanvasTransformer translate(final int openedX , final int closedX , final int openedY , final int closedY)
    {
        return translate(openedX, closedX, openedY, closedY, lin);
    }

    public CanvasTransformer translate(final int openedX , final int closedX , final int openedY , final int closedY , final Interpolator interp)
    {
        initTransformer();
        mTrans = new CanvasTransformer()
        {
            @Override
            public void transformCanvas(Canvas canvas , float percentOpen)
            {
                mTrans.transformCanvas(canvas, percentOpen);
                float f = interp.getInterpolation(percentOpen);
                canvas.translate((openedX - closedX) * f + closedX, (openedY - closedY) * f + closedY);
            }
        };
        return mTrans;
    }

    public CanvasTransformer concatTransformer(final CanvasTransformer t)
    {
        initTransformer();
        mTrans = new CanvasTransformer()
        {
            @Override
            public void transformCanvas(Canvas canvas , float percentOpen)
            {
                mTrans.transformCanvas(canvas, percentOpen);
                t.transformCanvas(canvas, percentOpen);
            }
        };
        return mTrans;
    }
}
